跳到主要内容

JZ53 表示数值的字符串

https://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8

这题很恶心,就是考察健壮性判断

import java.util.*;


public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return bool布尔型
*/
public boolean isNumeric (String str) {
if(str == null) return false;
// 去掉左右的空格
str = str.trim();
if (str.length() == 0) return false;

boolean hasE = false;
boolean hasDecimal = false;
boolean hasSign = false;
boolean hasNum = false; // 有可能有数字
for(int i = 0;i < str.length(); i++) {
char c = str.charAt(i);
if (c == '+' || c == '-') {
if (hasSign) return false;
else if (hasNum) return false; // 如果在数字后面出现符号那肯定是错的
else hasSign = true;
} else if (c >= '0' && c <= '9') {
hasNum = true;
} else if (c == 'e' || c == 'E') {
if (hasE) return false; // 只能出现一次
if (!hasNum) return false; // 不能出现在最前面
hasSign = false; // 因为 E 后面可能会跟一个符号,所以初始化它
hasE = true;
hasNum = false; // 同理,初始化
hasDecimal = true; // 使用了 E 的科学计数就不能用小数点了
} else if (c == '.') {
if (hasDecimal) return false;
hasDecimal = true;
} else {
return false;
}
}
// 健壮性判断
if (hasE && !hasNum) return false;
if (hasDecimal && !hasNum) return false;
if (hasSign && !hasNum) return false;

return true;
}
}